自动监视和更正操作概述
可以使用 SQL 管理 API、调度程序和向下钻取查询来管理自动维护、监视和管理任务。
GBase 8s 的这些组件简化了复杂系统中的信息收集和服务器维护。
SQL 管理 API
SQL 管理 API 用于通过 SQL 函数执行远程管理。因为 SQL 管理 API 操作完全在 SQL 中执行,所以可在客户机工具中使用这些函数来管理数据库服务器。
调度程序
调度程序是一组任务,用于在预定义时间或按照服务器内部确定的时间来执行 SQL 语句。SQL 语句可以收集信息或监视和调整服务器。
向下钻取查询
向下钻取查询提供了有关最近执行的 SQL 语句的统计信息,以便跟踪各个 SQL 语句的性能并分析语句历史记录。
可以在服务器 HAC 对的主服务器上使用 SQL 管理 API 和调度程序。
调度程序
可以使用调度程序创建作业,以用于在可预测时间运行管理任务或收集信息。调度程序使用 SQL 语句,而不是使用操作系统的作业调度工具。
调度程序由 sysadmin 数据库中的一组表进行控制。
调度程序有四种不同的作业类型可供选择:
任务
在指定时间按照频率运行操作。
传感器
在特定时间按特定频率运行操作,以收集数据、创建结果表、将数据存储在结果表中,以及在指定时间之后清除旧数据。
启动任务
仅当服务器从静态模式切换为在线模式时才运行的任务。
启动传感器
仅当服务器从静态模式切换为在线模式时才运行的传感器。
任务或传感器的操作可以是一个或多个 SQL 语句、用户定义的例程或存储过程。
除了为任务或传感器定义操作之外,还可以使用调度程序执行以下操作:
- 将任务和传感器关联到功能组
- 每次运行任务或传感器时跟踪执行时间和返回值
- 使用各种严重性定义警报
- 定义阈值以控制何时运行任务或传感器
调度程序中包含可自动运行的内置任务和传感器。 可以修改内置任务和传感器,并定义自己的任务和传感器。
磁盘空间需求
调度程序表和传感器结果表可能使用大量磁盘空间。
您可以使用以下公式来估计一个传感器的磁盘使用情况:
所收集的行数 * 所收集的行大小 * 每日的数据收集频率 * 保留期
对所有传感器重复该估计,然后您可以确定所需空间的接近估计值。
可以通过降低数据收集的频率来减小存储的数据量,或者通过更新 ph_task 表来缩短保留期。
可以使用 SQL 管理 API 将 sysadmin 数据库移至其他数据库空间,但是该数据库中的所有现有数据都将丢失。
有关 sysadmin 数据库的更多信息,请参阅《GBase 8s 管理员参考》。
调度程序表
调度程序表位于sysadmin数据库中,包含有关任务和传感器的信息。
sysadmin 数据库包含下表中列出的调度程序表。ph_task 表与其他各表具有直接关系。
表 1. 调度程序表
表 | 描述 |
---|---|
ph_alert | 包含与必须监视的任务关联的错误、警告或参考消息的列表。ph_alert 表包含数据库服务器自动使用的内置警报。 可以添加您自己的警报。 |
ph_group | 包含组名称的列表。每个任务和传感器都是组的成员。ph_group 表包含数据库服务器使用的内置组。 可以添加您自己的组。 |
ph_run | 包含有关每个任务和传感器的运行方式和运行时间的信息。 |
ph_task | 列出任务和传感器,并包含有关数据库服务器运行这些任务和传感器的方式和时间的信息。ph_task 表包含数据库服务器自动使用的内置任务和传感器。 可以添加您自己的任务和传感器。 |
ph_threshold | 包含与任务或传感器关联的阈值的列表。如果达到某个阈值,关联的任务可执行某个操作,例如在 ph_alert 表中插入警报。 ph_threshold 表包含数据库服务器使用的内置阈值。 可以添加您自己的阈值。 |
results | 包含传感器收集的历史数据的多个表。这些表的结构由 ph_task 表的传感器定义中的 CREATE TABLE 语句确定。 |
有关这些表的详细信息,请参阅《GBase 8s 管理员参考》。
内置任务和传感器
调度程序中包含可自动运行的内置任务和传感器。
下表显示内置调度程序任务和传感器。传感器具有结果表,其中存储了所收集信息,以及用于确定信息存储时间长度的保留期。可通过更新ph_task 表来更改任务和传感器属性,如频率。某些任务由阈值触发。可通过更新 ph_threshold 表更改阈值。 可通过将 ph_task 表中 tk_enable 列的值更改为 f 来禁用任务或传感器。
通过查询ph_task 表中的 run_duration 列,可以确定任务所用的时间。
表 1. 内置任务和传感器
任务或传感器 | 描述 | 结果表 | 频率 | 保留 时间 |
---|---|---|---|---|
add_storage | 此任务在配置自动空间管理时自动添加更多存储空间。 | 根据需要 | ||
清除警报 | 该任务从 ph_alert 表中除去存在时间超过了阈值(15 天)的所有警报条目。该阈值在 ph_threshold 表中的名称为 ALERT HISTORY RETENTION。 | 每天一次 | ||
auto_compress | 此任务压缩配置为自动压缩的表。 | |||
auto_crsd | 该任务对表和分段执行压缩、收缩、重新打包和取消分段操作。 缺省情况下,已禁用该任务。 必须通过更新 ph_task 表启用该任务。 每个操作在 ph_threshold 表中有两行:一行控制是否启用了该操作,一行控制该操作的阈值。 有关更多信息,请参阅自动优化数据存储。 | 每周一次 | ||
autoreg exe | 该任务注册首次使用的数据库扩展。 | 根据需要 | ||
autoreg migrate-console | 内部。此任务使用日志或缓冲日志的日志记录选项来检查每个数据库,并根据需要将所有内置数据库扩展迁移到对于数据库服务器而言正确的版本。此任务根据需要为各个数据库创建子任务。 | 服务器启动时 | ||
autoreg vp | 该任务在必要时为数据库扩展创建专用虚拟处理器。 | 根据需要 | ||
auto_tune_cpu_vps | 如果分配的 VP 数小于计算机上的 CPU 处理器数的一半,该任务将自动添加 CPU 虚拟处理器。 | 服务器启动时 | ||
Auto Update Statistics 评估 | 该任务根据当前 Auto Update Statistics (AUS) 策略分析记录的所有数据库中的所有表,标识必须更新其分发的表,并为这些表生成 UPDATE STATISTICS 语句。AUS 策略由 ph_threshold 表中的阈值设置: ● AUS_AGE:统计信息在 30 天之后更新。 ● AUS_CHANGE:统计信息在更改数据量达到 10% 时更新。 ● AUS_AUTO_RULES:按照准则更新统计信息。 ● AUS_SMALL_TABLES:包含的行数少于 100 的表始终自行更新其统计信息。 | 每天一次 | ||
Auto Update Statistics 刷新 | 该任务运行“Auto Update Statistics 评估”任务生成的 UPDATE STATISTICS 语句。更新统计信息的 PDQ 优先级由 ph_threshold 表中的阈值 AUS_PDQ 设置为 10。 | 每周六和周日的凌晨 1 点到 5 点之间 | ||
bad_index_alert | 该任务检查已损坏的索引。如果找到了任何已损坏索引,将向 ph_alert 表添加警告警报。 有关更多信息,请参阅验证索引。 | 每天一次 | ||
bar_act_log_rotate | 该任务对 BAR_ACT_LOG 配置参数中指定的 ON-Bar 活动日志文件进行循环交替。 ON-Bar 活动日志循环交替时,服务器将切换到新联机消息日志文件,并将之前的日志文件的标识号加 1。达到日志文件最大数量之后,会删除具有最高标识的日志文件。 要循环交替的最大日志的阈值在 ph_threshold 表中指定。 | 每 30 天的凌晨 3 点(最大日志文件数为 12) | ||
bar_debug_log_rotate | 该任务对 BAR_DEBUG_LOG 配置参数中指定的 ON-Bar 调试日志文件进行循环交替。 ON-Bar 调试日志循环交替时,服务器将切换到新联机消息日志文件,并将之前的日志文件的标识号加 1。达到日志文件最大数量之后,会删除具有最高标识的日志文件。 要循环交替的最大日志的阈值在 ph_threshold 表中指定。 | 每 30 天的凌晨 3 点(最大日志文件数为 12) | ||
check_backup | 该任务检查以确保 ph_threshold 表中的阈值指定的时间段以来已运行了备份。 ● REQUIRED LEVEL BACKUP:任何级别备份之间最大为 2 天 ● REQUIRED LEVEL 0 BACKUP: 0 级备份之间最大为 2 天 如果未进行备份,将向 ph_alert 表添加警告警报。 | 每天一次 | ||
check_for_ipa | 对于每一个具有一个或多个未完成定点变更操作的表,该任务为其在 ph_alert 表中添加一个条目。 | 每周一次 | ||
idle_user_timeout | 该任务终止空闲时间超过了 60 分钟的用户会话。 缺省情况下,已禁用该任务。 必须通过更新 ph_task 表启用该任务。 有关更多信息,请参阅自动终止空闲连接。 | 每 2 小时 | ||
ifx_ha_monitor_log_replay_task | 该任务监视高可用性集群的重放位置。 | 未设置 | ||
ifx_TrickleFeed_load_ID | 此任务持续刷新数据集市中的数据。数据集市和加速器的名称在任务描述中列出。在为数据集市启用缓慢更新后,此任务在调度程序中显示。每个已启用缓慢更新的数据集市都有一个单独的任务。任务名称中的 ID 是唯一的。 | 启用缓慢更新时指定的每个秒数 | ||
mon_checkpoint | 该传感器保存有关检查点的信息。 | mon_checkpoint | 每小时 | 7 天 |
mon_chunk | 此传感器保存有关块使用情况和 I/O 块性能的常规信息。 | mon_chunk | 每小时 | 30 天 |
mon_command_history | 该任务从 command_history 表中删除存在时间超过了阈值(30 天)的行。该阈值在 ph_threshold 表中的名称为 COMMAND HISTORY RETENTION。 | 每天一次 | ||
mon_compression_estimates | 此传感器保存有关在压缩数据时可节省的空间量的信息。 | mon_compression_ estimates | 每周一次 | 30 天 |
mon_config | 该传感器保存 onconfig 文件中每个配置参数的最新值。 | mon_config | 每天一次 | |
mon_config_startup | 该传感器保存服务器启动时 onconfig 文件中每个配置参数的值。 | mon_config | 服务器启动时 | 99 天 |
mon_iohistory | 此传感器保存有关块 I/O 的性能信息。您可以在 ph_threshold 表中更改 IO_SAMPLES_PER_HOUR 参数以更频繁地收集信息。 | 每小时 | 30 天 | |
mon_low_storage | 该任务扫描数据库空间列表,以查找低于 SP_THRESHOLD 配置参数指定的阈值的空间。然后,该任务将通过使用存储池中的条目来扩展块或添加块,以扩充空间。 有关更多信息,请参阅自动空间管理。 | mon_low_storage | 每小时 | 7 天 |
mon_memory_system | 该传感器收集有关服务器所用内存量的信息。 | mon_memory_system | 每小时 | 7 天 |
mon_page_usage | 此传感器保存有关存储空间中已用和可用的页面的信息。 | mon_page_usage | 每天一次 | 7 天 |
mon_profile | 该传感器保存服务器概要文件信息。 | mon_prof | 每 4 小时 | 30 天 |
mon_sysenv | 该启动传感器保存数据库服务器启动时有关环境的信息。 | mon_sysenv | 服务器启动时 | 60 天 |
mon_table_names | 该传感器保存表名称及其创建时间。 | mon_table_names | 每天一次 | 30 天 |
mon_table_profile | 该传感器保存表概要文件信息,其中包括该表上发生的更新、插入和删除操作的总数。 | mon_table_profile | 每天一次 | 7 天 |
mon_users | 该传感器保存有关每个用户的概要文件信息。 | mon_users | 每 4 小时 | 7 天 |
mon_vps | 该传感器收集虚拟处理器信息。 | mon_vps | 每 4 小时 | 15 天 |
online_log_rotate | 该任务对 MSGPATH 配置参数中指定的联机消息日志文件进行循环交替。 联机消息日志循环交替时,服务器将切换到新联机消息日志文件,并将之前的日志文件的标识号加 1。达到日志文件最大数量之后,会删除具有最高标识的日志文件。 要循环交替的最大日志的阈值在 ph_threshold 表中指定。 | 每 30 天的凌晨 3 点(最大日志文件数为 12) | ||
post_alarm_message | 该任务发布警报。 | 每小时 | ||
purge_tables | 此任务标识已超过其清除策略的滚动窗口表。它根据每个清除策略放弃或分离符合条件的分段,直至满足该策略或者直至无法再除去任何分段。 | 每天 00:45 | ||
SET tk_enable | 此任务启用对消息日志文件进行循环交替的任务。 | 每 30 天的凌晨 3 点 |
创建任务
可以创建调度程序任务,以用于在特定时间执行特定操作。
必须以用户gbasedbt 或其他授权用户身份连接 sysadmin 数据库。
要创建任务,请使用 INSERT 语句在 ph_task 表中添加一行:
-
包含以下列的值:
- tk_name:为任务提供唯一名称。
- tk_type:将作业类型更改为 TASK 或 STARTUP TASK。
- tk_description:添加任务所执行的操作的描述。
- tk_execute:添加任务所执行的操作。
该操作可以是用户定义的函数、单个 SQL 语句或使用 PREPARE SQL 创建的多语句预编译对象,该多语句预编译对象用于在运行时组合使用一个或多个 SQL 语句。
命令长度限制为 2048 个字节。
-
可选: 更改以下列的缺省值:
- tk_start_time:缺省启动时间为 8:00:00。对于启动任务,请将启动时间设置为 NULL。
- tk_stop_time:缺省停止时间为 19:00:00。对于启动任务,请将停止时间设置为 NULL。
- tk_frequency:缺省频率为一天一次。对于启动任务,请将频率设置为 NULL。
- tk_group:缺省组为 MISC。
- tk_monday 到tk_sunday:缺省值为每天运行。
任务会在指定的开始时间以及随后通过频率计算的时间运行。
示例
以下任务使用 SQL 管理 API 在周一、周三和周五早上 8 点到晚上 7 点之间,每隔两分钟执行一个检查点。
INSERT INTO ph_task
( tk_name,
tk_description,
tk_type,
tk_group,
tk_execute,
tk_start_time,
tk_stop_time,
tk_frequency,
tk_Monday,
tk_Tuesday,
tk_Wednesday,
tk_Thursday,
tk_Friday,
tk_Saturday,
tk_Sunday)
VALUES
( "Example Checkpoint",
"Example to do a checkpoint every 2 minutes.",
"TASK",
"EXAMPLES",
"EXECUTE FUNCTION admin('checkpoint')",
DATETIME(08:00:00) HOUR TO SECOND,
DATETIME(19:00:00) HOUR TO SECOND,
INTERVAL ( 2 ) MINUTE TO MINUTE,
't',
‘f',
't',
‘f',
't',
‘f',
‘f');
以下示例显示了在一天的凌晨 2:00 运行一次的任务代码,以确保 command_history 表仅包含最近的数据。在该示例中,最近数据的定义存储在 ph_threshold 表的 Command History Interval 列中。
INSERT INTO ph_task
(
tk_name,
tk_group,
tk_description,
tk_type,
tk_execute,
tk_start_time,
tk_frequency
)
VALUES
(
"mon_command_history",
"TABLES",
"Monitor how much data is kept in the command history table",
"TASK",
"delete from command_history where cmd_exec_time < (
select current - value::INTERVAL DAY to SECOND
from ph_threshold
where name = 'COMMAND HISTORY INTERVAL' ) ",
"2:00:00",
"1 0:00:00"
);
创建传感器
可创建调度程序传感器来收集和存储有关数据库服务器的数据。
必须以用户 gbasedbt 或其他授权用户身份连接 sysadmin 数据库。
要创建传感器,请使用 INSERT 语句在 ph_task 表中添加行:
-
包含以下列的值:
- tk_name:为任务提供唯一名称。
- tk_description:添加任务所执行的操作的描述。
- tk_result_table:添加用于保存传感器所收集数据的表的名称。
- tk_create:添加 CREATE 语句以创建结果表。结果表必须具有名为 ID 的 INTEGER 列,用于容纳传感器标识。可向该表添加其他列。
- tk_execute:添加传感器执行的操作。该操作可以是用户定义的函数、单个 SQL 语句或使用 PREPARE SQL 创建的多语句预编译对象,该多语句预编译对象用于在运行时组合使用一个或多个 SQL 语句。
-
可以选择更改以下列的缺省值:
- tk_type:缺省值为 SENSOR。对于启动传感器,请将该值更改为 STARTUP SENSOR。
- tk_delete:删除传感器数据之前的缺省时间间隔为一天。
- tk_start_time:缺省启动时间为 8:00:00。对于启动传感器,请将启动时间设置为 NULL。
- tk_stop_time:缺省停止时间为 19:00:00。对于启动传感器,请将停止时间设置为 NULL。
- tk_frequency:缺省频率为一天一次。对于启动传感器,请将频率设置为 NULL。
- tk_group:缺省组为 MISC。
- tk_monday到tk_sunday:缺省值为每天运行。
传感器会在指定的开始时间以及随后通过频率计算的时间运行。
示例
以下示例显示了跟踪数据库服务器启动环境的传感器的代码。传感器当前执行的是 $DATA_SEQ_ID 变量。
INSERT INTO ph_task
(
tk_name,
tk_type,
tk_group,
tk_description,
tk_result_table,
tk_create,
tk_execute,
tk_stop_time,
tk_start_time,
tk_frequency,
tk_delete
)
VALUES
(
"mon_sysenv",
"STARTUP SENSOR",
"SERVER",
"Tracks the database servers startup environment.",
"mon_sysenv",
"create table mon_sysenv (ID integer, name varchar(250), value lvarchar(1024))",
"insert into mon_sysenv select $DATA_SEQ_ID, env_name, env_value
FROM sysmaster:sysenv",
NULL,
NULL,
NULL,
"60 0:00:00"
);
以下示例显示收集有关正在使用的内存量的信息并在 mon_memory_system 表中存储信息的传感器的代码。如果表不存在,那么任务将创建表。该任务(每 30 分钟运行一次)将删除mon_memory_system 表中存在时间超过 30 天的任何数据。
INSERT INTO ph_task
(
tk_name,
tk_group,
tk_description,
tk_result_table,
tk_create,
tk_execute,
tk_stop_time,
tk_start_time,
tk_frequency,
tk_delete
)
VALUES
("mon_memory_system",
"MEMORY",
"Server memory consumption",
"mon_memory_system",
"create table mon_memory_system (ID integer, class smallint, size int8,
used int8, free int8 )",
"insert into mon_memory_system select $DATA_SEQ_ID, seg_class, seg_size,
seg_blkused, seg_blkfree FROM sysmaster:sysseglst",
NULL,
NULL,
INTERVAL ( 30 ) MINUTE TO MINUTE,
INTERVAL ( 30 ) DAY TO DAY);
任务和传感器的操作
任务或传感器的操作是用于执行一个或多个操作的 SQL 语句或例程。
如果操作中仅包含单个操作,SQL 语句很有用。 如果操作中包含多个操作,使用 C 或 Java™ 编写的存储过程或用户定义的例程很有用。操作存储在ph_task 表的 tk_execute列中。
创建操作时具有很高的灵活性。 操作类型可包括:
- 执行 DML 操作。可使用传感器在表中插入或更新数据。可使用任务从表中删除较旧的数据。
- 执行管理操作。可使用任务来运行 SQL 管理 API 函数,以管理数据库服务器。 例如,可创建一个任务来每两分钟执行一次检查点。
- 基于阈值执行操作。可使用 ph_threshold 表中的阈值确定是否必须运行某个任务操作。例如,可创建一个任务,该任务在可用共享内存量低于阈值时添加共享内存段。
- 创建警报以报告操作或警告存在潜在问题。例如,可创建一个任务,用于在用户会话终止时终止在 ph_alert 表中插入行的空闲用户。也可创建任务来监视备份,并在备份未执行时在 ph_alert 表中插入警告。
请在任务或传感器操作中使用以下变量:
- $DATA_TASK_ID:用于指示当前任务或传感器。该变量对应于 ph_task 表中 tk_id 字段的值。
- $DATA_SEQ_ID:用于指示任务或传感器的当前执行情况。该变量对应于 ph_task 表中的 tk_sequence 字段和 ph_run 表中的 run_task_sequence 字段的值。
示例
以下操作是使用的 SQL 语句,供内置 mon_command_history 任务用于从command_history 表中除去较旧的行。
DELETE FROM command_history
WHERE cmd_exec_time < (
SELECT CURRENT - value::INTERVAL DAY to SECOND
FROM ph_threshold
WHERE name = 'COMMAND HISTORY RETENTION' )
以下示例描述的是 SQL 语句,供内置 mon_vps 传感器用于向 mon_vps 结果表添加数据:
INSERT INTO mon_vps
SELECT $DATA_SEQ_ID, vpid, num_ready,
class, usecs_user, usecs_sys
FROM sysmaster:sysvplst
以下示例描述的是存储过程,用于终止空闲时间超过了阈值设置值的用户会话,并且向 ph_alert 表添加警报。
/*
**************************************************************
* Create a function that will find all users that have
* been idle for the specified time. Call the SQL admin API to
* terminate those users. Create an alert to track which
* users have been terminated.
**************************************************************
*/
CREATE FUNCTION idle_timeout( task_id INT, task_seq INT)
RETURNING INTEGER
DEFINE time_allowed INTEGER;
DEFINE sys_hostname CHAR(16);
DEFINE sys_username CHAR(257);
DEFINE sys_sid INTEGER;
DEFINE rc INTEGER;
{*** Get the maximum amount of time to be idle ***}
SELECT value::integer
INTO time_allowed
FROM ph_threshold
WHERE name = "IDLE TIMEOUT";
{*** Find all users who are idle longer than the threshold ***}
FOREACH SELECT admin("onmode","z",A.sid), A.username, A.sid, hostname
INTO rc, sys_username, sys_sid, sys_hostname
FROM sysmaster:sysrstcb A , sysmaster:systcblst B,
sysmaster:sysscblst C
WHERE A.tid = B.tid
AND C.sid = A.sid
AND lower(name) in ("sqlexec")
AND CURRENT - DBINFO("utc_to_datetime",last_run_time) > time_allowed UNITS MINUTE
AND lower(A.username) NOT IN( "gbasedbt", "root")
{*** If a user is successfully terminated, log ***}
{*** the information into the alert table. ***}
IF rc > 0 THEN
INSERT INTO ph_alert
(
ID, alert_task_id,alert_task_seq,
alert_type, alert_color,
alert_state,
alert_object_type, alert_object_name,
alert_message,
alert_action
) VALUES (
0,task_id, task_seq,
"INFO", "GREEN",
"ADDRESSED",
"USER","TIMEOUT",
"User "||TRIM(sys_username)||"@"||TRIM(sys_hostname)||
" sid("||sys_sid||")"||
" terminated due to idle timeout.",
NULL
);
END IF
END FOREACH;
RETURN 0;
END FUNCTION;
创建组
可创建组来组织调度程序任务和传感器。
必须以用户gbasedbt 或其他授权用户身份连接sysadmin 数据库。
创建任务或传感器时,可在 ph_task 表的tk_group列中指定 ph_group 表中的组名。
要创建组,请执行以下操作:
使用 INSERT 语句将行添加到 sysadmin 数据库中的 ph_group 表中。
必须在 group_name 列中包含组的名称,并且在 group_description 列中包含组的描述。数据库服务器在 group_id列中为组生成标识。
示例
以下示例添加名为 TABLES 的组:
INSERT INTO ph_group
(
group_name,
group_description
)
VALUES
(
"TABLES",
"Tasks that trim history and results tables."
);
创建阈值
可创建阈值来确定运行调度程序任务或传感器的条件。
必须以用户 gbasedbt 或其他授权用户身份连接 sysadmin 数据库。
阈值指定一个值,该值可用于与当前值进行比较,以便确定是否必须运行任务或传感器。
要创建阈值,请执行以下操作:
-
使用 INSERT 语句添加 ph_threshold 表中以下列的值:
- name:阈值的名称
- task_name:ph_task 表中的任务的名称
- value:阈值的值
- value_type:阈值的数据类型(STRING 或 NUMERIC)
- description:阈值所执行操作的描述
-
编写任务或传感器操作以使用阈值。
示例
以下示例为任务 Idle_timeout 添加阈值 IDLE TIMEOUT:
INSERT INTO ph_threshold
(
name,
task_name,
value,
value_type,
description)
VALUES
(
"IDLE TIMEOUT",
"Idle_timeout",
"60",
"NUMERIC",
"Maximum amount of time in minutes for non-gbasedbt users to be idle."
);
任务操作从当前时间中减去上一个用户操作的时间,并将该值与 ph_threshold 表中的值列进行比较。
创建警报
执行调度程序任务或传感器的操作时,可创建警报。
必须以用户gbasedbt 或其他授权用户身份连接sysadmin数据库。
要创建警报,请执行以下操作:
使用 INSERT 语句在 ph_alert表中添加行。 包含以下列的值:
- ID:生成的系统;请为该值使用 0。
- alert_task_id:必须引用ph_task 表中的作业标识。
- alert_task_seq:必须引用 ph_task 表中的作业序号。
- alert_type:选择 INFO、WARNING 或 ERROR。
- alert_color:选择 GREEN、YELLOW 或 RED。
- alert_state:选择 NEW、IGNORED、ACKNOWLEDGED 或 ADDRESSED。
- alert_object_type:警报描述的对象类型,如 SERVER。
- alert_object_name:对象的名称。
- alert_message:描述警报的消息。
- alert_action:用于执行更正操作 SQL 语句或函数,或者为 NULL。
示例
以下示例添加一个警报,用于警告尚未执行备份。此代码片段是将 task_id 和 task_seq 用作自变量的存储过程的一部分。
INSERT INTO ph_alert
(
ID,
alert_task_id,
alert_task_seq,
alert_type,
alert_color,
alert_state,
alert_object_type,
alert_object_name,
alert_message,
alert_action
)
VALUES
(
0,
task_id,
task_seq,
"WARNING",
"RED",
"NEW",
"SERVER",
"dbspace_name",
"Dbspace ["||trim(dbspace_name)|| "] has never had a level-0 backup.
Recommend taking a level-0 backup immediately.",
NULL
);
监视调度程序
可使用 onstat -g dbc 命令监视正在运行的调度程序线程。可在 ph_run 表中查看有关已完成的任务和传感器的信息。
调度程序在运行时使用以下两种线程:
- dbWorker:这种线程运行已调度的任务和传感器。
- dbScheduler:该线程准备已安排要运行的下一个任务或传感器。
要查看有关当前正在运行的任务和传感器以及将运行的下一个任务或传感器的信息,请使用 onstat -g dbc 命令。
要查看有关已完成的任务和传感器的信息,请查询sysadmin 数据库中的 ph_run 表。 必须以用户gbasedbt 或其他授权用户身份连接sysadmin 数据库。
示例
onstat -g dbc 命令的以下输出显示两个 dbWorker 线程以及 dbScheduler 线程:
Worker Thread(0) 46fa6f10
=====================================
Task: 47430c18
Task Name: mon_config_startup
Task ID: 3
Task Type: STARTUP SENSOR
Last Error
Number -310
Message Table (gbasedbt.mon_onconfig)
already exists in database.
Time 09/11/2007 11:41
Task Name mon_config_startup
Task Execution: onconfig_save_diffs
WORKER PROFILE
Total Jobs Executed 10
Sensors Executed 8
Tasks Executed 2
Purge Requests 8
Rows Purged 0
Worker Thread(1) 46fa6f80
=====================================
Task: 4729fc18
Task Name: mon_sysenv
Task ID: 4
Task Type: STARTUP SENSOR
Task Execution: insert into mon_sysenv select 1, env_name,
env_value FROM sysmaster:sysenv
WORKER PROFILE
Total Jobs Executed 3
Sensors Executed 2
Tasks Executed 1
Purge Requests 2
Rows Purged 0
Scheduler Thread 46fa6f80
=====================================
Run Queue
Empty
Run Queue Size 0
Next Task 7
Next Task Waittime 57
以下输出显示 ph_run 表中四个调度程序作业的历史记录:
SELECT * FROM ph_run;
RUN_ID 1
RUN_TASK_ID 2
RUN_TASK_SEQ 1
RUN_RETCODE 0
RUN_TIME 2009-07-20 13\:04\:59
RUN_DURATION 0.131850300007433
RUN_ZTIME 1248109468
RUN_BTIME 1248109468
RUN_MTIME 1248109499
RUN_ID 2
RUN_TASK_ID 3
RUN_TASK_SEQ 1
RUN_RETCODE 0
RUN_TIME 2009-07-20 13\:04\:59
RUN_DURATION 0.120845244247991
RUN_ZTIME 1248109468
RUN_BTIME 1248109468
RUN_MTIME 1248109499
RUN_ID 3
RUN_TASK_ID 4
RUN_TASK_SEQ 1
RUN_RETCODE 0
RUN_TIME 2009-07-20 13\:04\:59
RUN_DURATION 0.00254887164461759
RUN_ZTIME 1248109468
RUN_BTIME 1248109468
RUN_MTIME 1248109499
RUN_ID 2087
RUN_TASK_ID 7
RUN_TASK_SEQ 742
RUN_RETCODE 0
RUN_TIME 2009-09-09 11\:09\:51
RUN_DURATION 0.00489335523104662
RUN_ZTIME 1248109468
RUN_BTIME 1248109468
RUN_MTIME 1252508991
修改调度程序
可以修改调度程序任务、传感器、警报、阈值或组的属性。既可修改内置属性,也可修改您添加的属性。
必须以用户gbasedbt 或其他授权用户身份连接sysadmin数据库。
要修改调度程序属性,请执行以下操作:
将 UPDATE 语句用于 sysadmin 数据库中的相应调度程序表。
示例
以下示例停止运行名为 task1 的任务:
UPDATE ph_task
SET tk_enable = "F"
WHERE tk_name = "task1";
以下示例将内置传感器 mon_profile 收集数据的时间量更改为 99 天:
UPDATE ph_task
SET tk_delete = "INTERVAL ( 99 ) DAY TO DAY"
WHERE tk_name = "mon_profile";
以下示例将名为 COMMAND HISTORY RETENTION 的阈值更改为 20,这样command_history 表会将有关 SQL 管理 API 命令的信息保留 20 天:
UPDATE ph_threshold SET value = "20 0:00:00"
WHERE name = "COMMAND HISTORY RETENTION";
自动监视和更正操作概述
可以使用 SQL 管理 API、调度程序和向下钻取查询来管理自动维护、监视和管理任务。
GBase 8s 的这些组件简化了复杂系统中的信息收集和服务器维护。
SQL 管理 API
SQL 管理 API 用于通过 SQL 函数执行远程管理。因为 SQL 管理 API 操作完全在 SQL 中执行,所以可在客户机工具中使用这些函数来管理数据库服务器。
调度程序
调度程序是一组任务,用于在预定义时间或按照服务器内部确定的时间来执行 SQL 语句。SQL 语句可以收集信息或监视和调整服务器。
向下钻取查询
向下钻取查询提供了有关最近执行的 SQL 语句的统计信息,以便跟踪各个 SQL 语句的性能并分析语句历史记录。
可以在服务器 HAC 对的主服务器上使用 SQL 管理 API 和调度程序。
这些工具中的每一个工具都需要额外的磁盘空间以用于存储信息。
使用 SQL 管理 API 执行远程管理
您可以使用 SQL 管理 API 来利用 SQL 语句执行远程管理任务。
SQL 管理 API 函数采用一个或多个自变量来定义任务。许多任务也可使用命令行实用程序来完成。使用 SQL 管理 API 函数的优点是可从其他数据库服务器远程运行这些函数。而运行命令行实用程序命令时,必须直接连接到数据库服务器。
使用 SQL 管理 API 可执行以下类型的管理任务:
- 控制数据压缩
- 更新配置参数
- 检查数据、分区和扩展数据块一致性,控制 B 型树扫描程序,以及强制执行检查点
- 设置和管理 Enterprise Replication
- 设置和管理高可用性集群
- 控制日志记录和逻辑日志
- 控制共享内存和添加缓冲池
- 控制镜像过程
- 控制决策支持查询
- 更改服务器方式
- 添加、删除和配置存储空间
- 控制 SQL 语句高速缓存
- 控制和配置 SQL 跟踪
- 动态启动和停止侦听控制线程
- 执行其他任务,例如移动 sysadmin 数据库、终止会话或添加虚拟处理器
有关 SQL 管理 API 的更多信息,请参阅《 GBase 8s 管理员参考》。
SQL 管理 API 的 admin() 和 task() 函数
SQL 管理 API 中包含两个在 sysadmin 数据库中定义的函数:admin() 和 task()。
这两个函数执行相同任务,但是返回不同格式的结果。task() 函数返回描述命令结果的字符串。admin() 函数返回整数。
缺省情况下,只有 gbasedbt 用户 可连接到 sysadmin 数据库。如果root 用户或 DBSA 组的成员被授予连接到 sysadmin 数据库的特权,那么该 root 用户或 DBSA 组的成员还可以运行 SQL 管理 API 的 task() 和 admin() 函数。
可以使用 EXECUTE FUNCTION 语句执行 admin() 和 task() 函数。 例如,等同于 oncheck -ce 命令的以下 SQL 语句可指示数据库服务器检查扩展数据块:
EXECUTE FUNCTION admin("check extents");
可在调度程序任务操作中使用 SQL 管理 API 函数。例如,可以通过在任务操作中使用以下语句来定义用于创建数据库空间的任务:
EXECUTE FUNCTION admin("create dbspace","dbspace2","/work/dbspace2","20 MB");
有关使用 admin() 和 task() 函数以及示例的信息,请参阅《GBase 8s 管理员参考》。
查看 SQL 管理 API 历史记录
可以查看sysadmin 数据库中 command_history 表内前 30 天运行的所有 SQL 管理 API 函数的历史记录。
必须以gbasedbt 用户或其他授权用户身份连接sysadmin 数据库。
command_history表显示了管理任务是通过 admin() 还是 task() 函数执行的,并显示了有关运行命令的用户、运行命令的时间、命令以及数据库服务器完成运行命令时返回的消息的信息。
要显示命令历史记录,请执行以下操作:
使用 SELECT 语句从command_history表返回数据。
以下示例显示过去 30 天的所有命令历史记录:
SELECT * FROM command_history;
下表显示了采样命令和采样 command_history 表中的相关联结果。有关 command_history 表中所有信息的描述,请参阅《GBase 8s 管理员参考》。
表 1. command_history 表中某些信息的示例
命令 | 样本返回消息 |
---|---|
设置 SQL 跟踪为打开 | SQL 跟踪打开,并带有 1000 个大小为 2024 字节的缓冲区。 |
创建数据库空间 | 空间“space12”已添加。 |
检查点 | 检查点已完成。 |
添加日志 | 已将 3 个逻辑日志添加到数据库空间日志数据库。 |
控制 command_history 表的大小
可以缩短 command_history 表的保留期或从该表中除去行,从而防止该表变得过大。
必须以 gbasedbt用户或其他授权用户身份连接sysadmin 数据库。
缺省情况下,command_history表中的行在 30 天之后会自动除去。保留期由 ph_threshold 表中的 COMMAND HISTORY RETENTION 行进行控制。
要缩短保留期,请执行以下操作:
使用 UPDATE 语句修改 ph_threshold 表中 COMMAND HISTORY RETENTION 行的值。
以下示例将保留期设置为 25 天:
UPDATE ph_threshold
SET value = "25"
WHERE name = "COMMAND HISTORY RETENTION";
可以使用 DELETE 或 TRUNCATE TABLE 之类的 SQL 命令手动从此表中除去数据。也可在 ph_task 表中创建任务以从 command_history表清除数据。
以下示例显示了监视command_history 表中的数据量并当表太旧时清除数据的任务。
INSERT INTO ph_task
( tk_name, tk_type, tk_group, tk_description, tk_execute,
tk_start_time, tk_stop_time, tk_frequency )
VALUES
("mon_command_history",
"TASK",
"TABLES",
"Monitor how much data is kept in the command history table",
"delete from command_history where cmd_exec_time < (
select current - value::INTERVAL DAY to SECOND
from ph_threshold
where name = 'COMMAND HISTORY RETENTION' ) ",
DATETIME(02:00:00) HOUR TO SECOND,
NULL,
INTERVAL ( 1 ) DAY TO DAY);
向下钻取查询
可以使用向下钻取查询(也称为 SQL 跟踪)来收集有关运行的每个 SQL 语句的统计信息以及分析语句历史记录。
SQL 跟踪可帮助您回答如下问题:
- SQL 语句耗费多少时间?
- 单个语句使用多少资源?
- 语句执行耗费多少时间?
- 等待每个资源耗费多少时间?
统计信息存储在循环缓冲区(内存中名为 syssqltrace 的伪表)中,即存储在 sysmaster 数据库中。您可以动态地调整循环缓冲区的大小。
缺省情况下,SQL 跟踪已关闭,但是您可以对所有用户或一组特定用户打开此功能。在启用具有缺省配置的 SQL 跟踪时,数据库服务器会跟踪运行的上 1000 条 SQL 语句,以及这些语句的概要统计信息。还可以全局禁用 SQL 跟踪或禁用对特定用户的 SQL 跟踪。
如果您计划保存大量历史信息,那么 SQL 跟踪所需的内存相当大。SQL 跟踪所需的缺省空间量为 2 MB。可以根据需求增加或减少存储量。
显示的信息包括:
-
运行命令的用户的用户标识
-
数据库会话标识
-
数据库的名称
-
SQL 语句的类型
-
SQL 语句执行的持续时间
-
该语句完成的时间
-
带有语句类型的 SQL 语句文本或函数调用列表(也称为堆栈跟踪),例如:
procedure1() calls procedure2() calls procedure3()
-
统计信息包括:
- 缓冲区读取和写入的数目
- 页面读取和写入的数目
- 排序和磁盘排序的数目
- 锁请求和等待的数目
- 逻辑日志记录的数目
- 索引缓冲区读取的数目
- 估计的行数
- 优化器估计成本
- 返回的行数
-
数据库隔离级别。
也可指定跟踪中要包含的信息的升级级别,如下所示:
- 低级别跟踪,缺省情况下已启用,用于捕获以下示例中显示的信息。该信息包含语句统计信息、语句文本和语句迭代器。
- 中等级别跟踪,除了用于捕获低级别跟踪中包含的所有信息外,还捕获表名、数据库名称和存储过程堆栈的列表。
- 高级别跟踪,除了用于捕获中等级别跟踪中包含的所有信息外,还捕获主变量。
所跟踪的信息量影响该历史数据所需的内存量。
您可以在任何时候启用和禁用跟踪,并可在数据库服务器运行时更改跟踪缓冲区的数目和大小。如果调整跟踪缓冲区的大小,那么数据库服务器将尝试维护缓冲区的内容。如果增大这些参数,数据将不会被截断。但是,如果缓冲区的数目或大小减小,那么跟踪缓冲区中的数据将被截断或丢失。
缓冲区的数目确定了所跟踪的 SQL 语句数。每个缓冲区包含单个 SQL 语句的信息。缺省情况下,各个跟踪缓冲区的大小是固定的。如果缓冲区中存储的文本信息超过跟踪缓冲区的大小,那么数据被截断。
以下示例显示 SQL 跟踪信息:
select * from syssqltrace where sql_id = 5678;
sql_id 5678
sql_address 4489052648
sql_sid 55
sql_uid 2053
sql_stmttype 6
sql_stmtname INSERT
sql_finishtime 1140477805
sql_begintxtime 1140477774
sql_runtime 30.86596333400
sql_pgreads 1285
sql_bfreads 19444
sql_rdcache 93.39127751491
sql_bfidxreads 5359
sql_pgwrites 810
sql_bfwrites 17046
sql_wrcache 95.24815205913
sql_lockreq 10603
sql_lockwaits 0
sql_lockwttime 0.00
sql_logspace 60400
sql_sorttotal 0
sql_sortdisk 0
sql_sortmem 0
sql_executions 1
sql_totaltime 30.86596333400
sql_avgtime 30.86596333400
sql_maxtime 30.86596333400
sql_numiowaits 2080
sql_avgiowaits 0.014054286131
sql_totaliowaits 29.23291515300
sql_rowspersec 169.8958799132
sql_estcost 102
sql_estrows 1376
sql_actualrows 5244
sql_sqlerror 0
sql_isamerror 0
sql_isollevel 2
sql_sqlmemory 32608
sql_numiterators 4
sql_database db3
sql_numtables 3
sql_tablelist t1
sql_statement insert into t1 select {+ AVOID_FULL(sysindices) } 0, tabname
有关所有表行的解释,请参阅《GBase 8s 管理员参考》的 sysmaster 数据库部分中有关 syssqltrace 表的信息。
使用 SQLTRACE 配置参数指定启动 SQL 跟踪信息
使用 SQLTRACE 配置参数可控制数据库服务器启动时的缺省跟踪行为。缺省情况下,不设置该参数。所设置的信息包括要跟踪的 SQL 语句数目和跟踪方式。
可以修改 onconfig 文件的任何用户均可修改 SQLTRACE 配置参数的值,并可影响启动配置。但是,只有用户gbasedbt、root或被授予 sysadmin数据库连接特权的 DBSA 才可以使用 SQL 管理 API 命令来修改 SQL 跟踪的运行时状态。
要在数据库服务器启动时指定 SQL 跟踪信息,请执行以下操作:
- 设置 onconfig 文件中的 SQLTRACE 配置参数。
- 重新启动数据库服务器。
示例
onconfig 文件中的以下设置指定数据库服务器将收集有关系统上所有用户执行过的低级别信息,最多收集 2000 条,并分配大约 4 MB 内存 (2000 * 2 KB)。
SQLTRACE level=LOW,ntraces=2000,size=2,mode=global
如果仅使用部分已分配的缓冲区空间(例如,缓冲区空间的 42%),那么所分配的内存量仍然为 2 KB。
如果不想设置 SQLTRACE 配置参数并重新启动了服务器,那么可以运行以下 SQL 管理 API 命令,该命令提供的功能与为当前会话设置 SQLTRACE 的功能相同:
EXECUTE FUNCTION task("set sql tracing on", 100,"1k","med","user");
在以用户方式启用 SQL 跟踪系统后,就可以启用对每个用户的跟踪。请参阅启用 SQL 跟踪。
有关使用 task() 和 admin() 函数的更多信息,请参阅《GBase 8s 管理员参考》。
有关 SQLTRACE 配置参数的更多信息(包括某些字段的最小值和最大值),请参阅《GBase 8s 管理员参考》。
全局禁用 SQL 跟踪或禁用对某个会话的 SQL 跟踪
即使 SQLTRACE 配置参数中指定的方式为 global 或 user,但如果要完全关闭所有用户和全局跟踪,并取消分配给 SQL 跟踪当前正在使用的资源,也可以禁用 SQL 跟踪。缺省情况下,禁用对所有用户的 SQL 跟踪。
必须以用户gbasedbt 或其他授权用户身份连接 sysadmin 数据库。
要禁用全局 SQL 跟踪,请运行使用set sql tracing off自变量的 SQL 管理 API task() 或 admin() 函数。
要禁用对特定会话的 SQL 跟踪,请运行 set sql tracing off 作为第一个自变量,会话标识号作为第二个自变量的 task() 或 admin() 函数。
示例
以下示例全局禁用 SQL 跟踪:
EXECUTE FUNCTION task('set sql tracing off');
(expression) SQL tracing off.
1 row(s) retrieved.
以下示例对标识为 47 的会话禁用 SQL 跟踪:
EXECUTE FUNCTION task("set sql user tracing off",47);
有关使用 task() 或 admin() 函数的更多信息,请参阅《GBase 8s SQL 指南:语法》。
启用对特定用户的 SQL 跟踪
在指定 user 作为 SQLTRACE 配置参数中的方式后,必须运行 SQL 管理 API task() 或 admin() 函数来打开对特定用户的 SQL 历史记录跟踪。
必须以用户gbasedbt或其他授权用户身份连接sysadmin数据库。
无需启用全局 SQL 跟踪,即可对特定用户进行 SQL 跟踪。
要启用对特定用户的 SQL 跟踪,请运行使用 set sql tracing on 作为第一个自变量,用户会话标识作为第二个自变量的 task() 或 admin() 函数。
要对除root或gbasedbt之外的所有用户启用用户 SQL 跟踪,可运行使用set sql tracing on 自变量和定义这些用户的信息的 task() 或 admin() 函数。
示例
以下示例对会话标识为 74 的用户启用 SQL 跟踪:
EXECUTE FUNCTION task("set sql user tracing on", 74);
以下示例启用对当前连接到系统的用户(只要它们未以用户 root 或 gbasedbt 身份登录)的 SQL 语句跟踪。
dbaccess sysadmin -<<END
execute function task("set sql tracing on", 1000, 1,"low","user");
select task("set sql user tracing on", session_id)
FROM sysmaster:syssessions
WHERE username not in ("root","gbasedbt");
END
有关 task() 和 admin() 函数的更多信息,请参阅《GBase 8s 管理员参考》。
启用对某个会话的全局 SQL 跟踪
可以通过运行 SQL 管理 API task() 或 admin() 函数,对当前会话启用全局 SQL 跟踪。
必须以用户gbasedbt或其他授权用户身份连接 sysadmin数据库。
缺省情况下,全局 SQL 跟踪未启用。可以设置 SQLTRACE 配置参数以永久启用全局跟踪。
要对当前数据库服务器会话启用全局用户 SQL 历史记录跟踪,请运行使用 set sql tracing on 自变量的 SQL 管理 API task() 或 admin() 函数。
示例
以下示例对所有用户启用全局低级别 SQL 跟踪:
EXECUTE FUNCTION task("set sql tracing on", 1000, 1,"low","global");
如果在语句运行后有新用户登录到系统,那么可以启用对该新用户的跟踪。请参阅启用 SQL 跟踪。
有关 task() 和 admin() 函数的更多信息,请参阅《GBase 8s SQL 指南:语法》。